package com.own.stu.bytebuddy.methodDelegation;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import net.bytebuddy.implementation.bind.annotation.*;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.concurrent.Callable;

public class UserManagerDelegation3 {

    /**
     * 被@RuntimeType标准的方法就是拦截方法,此时方法签名[或返回值, 这里不一样，会有转换异常]可以与被拦截方法不一致
     *
     */
    @RuntimeType
    public String randName(
            // 表示被拦截的目标对象，只有拦截实例方法或构造方法时可用
            @This Object targetObj,
            // 表示被拦截的目标方法，只有拦截实例方法或者静态方法或构造方法时可用
            @Origin Method targetMethod,
            // 目标方法的参数
            @AllArguments Object[] targetMethodArgs,
            // 表示被拦截的目标对象，只有拦截实例方法或构造方法时可用
            @Super Object targetObj2,
            // 若确定父类,也可用具体的父类来接受
            //@Super UserManager targetObj2,
            // 用于调用目标方法
            @SuperCall Callable<?> zCall
    ) {
        System.out.println("targetobj=" + targetObj);
        System.out.println("targetMethod.getName()=" + targetMethod.getName());
        System.out.println("Arrays.tostring(targetMethodArgs)= " + Arrays.toString(targetMethodArgs));
        System.out.println("targetobj2=" + targetObj2);

        try{
            System.out.println("origin - result :" + zCall.call());
        }catch (Exception e){
            e.printStackTrace();
        }

        return new HenceName("UserManagerDelegation3", (Long) targetMethodArgs[0]).toString();
    }

    @AllArgsConstructor
    @NoArgsConstructor
    @Data
    public static class HenceName {
        String name;
        Long id;
    }
}
